// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef BASE_WIN_SCOPED_GDI_OBJECT_H_
#define BASE_WIN_SCOPED_GDI_OBJECT_H_

#include <windows.h>

#include "base/scoped_generic.h"

namespace base {
namespace win {

    namespace internal {

        template <class T>
        struct ScopedGDIObjectTraits {
            static T InvalidValue() { return nullptr; }
            static void Free(T object) { DeleteObject(object); }
        };

        // An explicit specialization for HICON because we have to call DestroyIcon()
        // instead of DeleteObject() for HICON.
        template <>
        void inline ScopedGDIObjectTraits<HICON>::Free(HICON icon)
        {
            DestroyIcon(icon);
        }

    } // namespace internal

    // Like ScopedHandle but for GDI objects.
    template <class T>
    using ScopedGDIObject = ScopedGeneric<T, internal::ScopedGDIObjectTraits<T>>;

    // Typedefs for some common use cases.
    typedef ScopedGDIObject<HBITMAP> ScopedBitmap;
    typedef ScopedGDIObject<HRGN> ScopedRegion;
    typedef ScopedGDIObject<HFONT> ScopedHFONT;
    typedef ScopedGDIObject<HICON> ScopedHICON;

} // namespace win
} // namespace base

#endif // BASE_WIN_SCOPED_GDI_OBJECT_H_
